/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.jm.financeiro.datamodel;

import br.jm.financeiro.entity.Empreendimento;
import br.jm.financeiro.entity.EmpreendimentoLote;
import br.jm.financeiro.sistema.eao.EmpreendimentoEao;
import br.jm.financeiro.sistema.eao.EmpreendimentoLoteEao;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;
import org.primefaces.model.LazyDataModel;
import org.primefaces.model.SortOrder;

/**
 *
 * @author joao
 */
public class LazyEmpreendimento extends LazyDataModel<Empreendimento> {

    private List<Empreendimento> datasource;
    private final EmpreendimentoEao empreendimentoJpa;
    private final EmpreendimentoLoteEao empreendimentoLoteJpa;
    private String cFiltro;
    private String cParametroSQL;
    private boolean lSorter;
    private int dataSize;
    private int nTotal;
    private EmpreendimentoLote selectedEmpreendimentoLote;
    public HttpSession session;

    public LazyEmpreendimento(EmpreendimentoEao empreendimentoJpa) {
        this.empreendimentoJpa = empreendimentoJpa;
        this.nTotal = empreendimentoJpa.getCount("Empreendimento");
        this.empreendimentoLoteJpa = EmpreendimentoLoteEao.getInstance();
    }

    public Empreendimento getRowData(Integer rowKey) {
        for (Empreendimento empreendimento : datasource) {
            if (Objects.equals(empreendimento.getIdEmpreendimento(), rowKey)) {
                return empreendimento;
            }
        }

        return null;
    }

    @Override
    public Object getRowKey(Empreendimento empreendimento) {
        return empreendimento.getIdEmpreendimento();
    }

    @Override
    public void setRowIndex(int rowIndex) {
        /*
         * The following is in ancestor (LazyDataModel):
         * this.rowIndex = rowIndex == -1 ? rowIndex : (rowIndex % pageSize);
         */
        if (rowIndex == -1 || getPageSize() == 0) {
            super.setRowIndex(-1);
        } else {
            super.setRowIndex(rowIndex % getPageSize());
        }
    }

    @Override
    public int getRowCount() {
        return this.dataSize;
    }

    @Override
    public List<Empreendimento> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String, Object> filters) {
        FacesContext ctx = FacesContext.getCurrentInstance();
        session = (HttpSession) ctx.getExternalContext().getSession(false);

        this.cFiltro = (String) session.getAttribute("filtroSinal");
        String cStatus = (String) session.getAttribute("status_empreendimento");
        String cEmpreendimento = (String) session.getAttribute("processo_empreendimento");

        List<Empreendimento> data = new ArrayList<>();
        List<EmpreendimentoLote> empreendimentoLoteList;

        selectedEmpreendimentoLote = new EmpreendimentoLote();
        try {
            //filter
            lSorter = !SortOrder.ASCENDING.equals(sortOrder);
            Map<String, Object> filtroLote = new HashMap<>();

            if (cFiltro != null) {
                if (filters.containsKey("numProcesso")) {
                    String cProcesso = filters.get("numProcesso").toString().replace("_", "");
                    filtroLote.put("numProcesso", cProcesso);
                }
                if (filters.containsKey("dscLote")) {
                    filtroLote.put("idAssunto.dscAssunto", filters.get("dscLote"));
                }
                empreendimentoLoteList = empreendimentoLoteJpa.getNative("EmpreendimentoLote", 0, empreendimentoLoteJpa.getCount("EmpreendimentoLote"), null, true, filtroLote, null, cFiltro);

                cFiltro = null;
                filters.remove("numProcesso");
                filters.remove("dscLote");

                if (!empreendimentoLoteList.isEmpty()) {
                    cFiltro = " empreendimento.id_empreendimento in (";

                    for (EmpreendimentoLote empreendimentoLoteList1 : empreendimentoLoteList) {
                        selectedEmpreendimentoLote = empreendimentoLoteList1;
                        cFiltro += selectedEmpreendimentoLote.getIdEmpreendimento().getIdEmpreendimento().toString().concat(",");
                    }
                    cFiltro += "0) ";
                }
            } else if (filters.containsKey("numProcesso")) {
                String cProcesso = filters.get("numProcesso").toString().replace("_", "");
                filtroLote.put("numProcesso", cProcesso);
                if (filters.containsKey("dscLote")) {
                    filtroLote.put("idAssunto.dscAssunto", filters.get("dscLote"));
                }

                empreendimentoLoteList = empreendimentoLoteJpa.getNative("EmpreendimentoLote", 0, 1, null, true, filtroLote, null, null);

                filters.remove("numProcesso");
                filters.remove("dscLote");
                if (!empreendimentoLoteList.isEmpty()) {
                    cFiltro = " empreendimento.id_empreendimento in (";

                    for (EmpreendimentoLote empreendimentoLoteList1 : empreendimentoLoteList) {
                        selectedEmpreendimentoLote = empreendimentoLoteList1;
                        cFiltro += selectedEmpreendimentoLote.getIdEmpreendimento().getIdEmpreendimento().toString().concat(",");
                    }
                    cFiltro += "0) ";

                    filters.put("idEmpreendimento", selectedEmpreendimentoLote.getIdEmpreendimento().getIdEmpreendimento().toString());
                }
            } else if (filters.containsKey("dscLote")) {
                filtroLote.put("idAssunto.dscAssunto", filters.get("dscLote"));
                if (filters.containsKey("numProcesso")) {
                    String cProcesso = filters.get("numProcesso").toString().replace("_", "");
                    filtroLote.put("numProcesso", cProcesso);
                }
                
                empreendimentoLoteList = empreendimentoLoteJpa.getNative("EmpreendimentoLote", 0, empreendimentoLoteJpa.getCount("EmpreendimentoLote"), null, true, filtroLote, null, null);

                filters.remove("numProcesso");
                filters.remove("dscLote");
                if (!empreendimentoLoteList.isEmpty()) {
                    cFiltro = " empreendimento.id_empreendimento in (";

                    for (EmpreendimentoLote empreendimentoLoteList1 : empreendimentoLoteList) {
                        selectedEmpreendimentoLote = empreendimentoLoteList1;
                        cFiltro += selectedEmpreendimentoLote.getIdEmpreendimento().getIdEmpreendimento().toString().concat(",");
                    }
                    cFiltro += "0) ";
                }

                //data = empreendimentoJpa.getNative("Empreendimento", first, pageSize, sortField, lSorter, filters, cParametroSQL, cFiltro);
                //this.dataSize = data.size();
            } else if (cEmpreendimento != null) {
                cFiltro = " status = 'A' ";
                empreendimentoLoteList = empreendimentoLoteJpa.getNative("EmpreendimentoLote", 0, empreendimentoLoteJpa.getCount("EmpreendimentoLote"), null, true, null, null, cFiltro);

                if (!empreendimentoLoteList.isEmpty()) {
                    cFiltro = " empreendimento.id_empreendimento in (";

                    for (EmpreendimentoLote empreendimentoLoteList1 : empreendimentoLoteList) {
                        selectedEmpreendimentoLote = empreendimentoLoteList1;
                        cFiltro += selectedEmpreendimentoLote.getIdEmpreendimento().getIdEmpreendimento().toString().concat(",");
                    }
                    cFiltro += "0) ";
                }
            }

            if (cStatus != null) {
                if (this.cFiltro != null) {
                    this.cFiltro += " and sta_empreendimento = 'A' and cliente.sta_cliente = 'A' ";
                } else {
                    this.cFiltro = " sta_empreendimento = 'A' and cliente.sta_cliente = 'A'  ";
                }
            }

            data = empreendimentoJpa.getNative("Empreendimento", first, nTotal, sortField, lSorter, filters, cParametroSQL, cFiltro);

            this.dataSize = data.size();
        } catch (Exception ex) {
            Logger.getLogger(LazyEmpreendimento.class.getName()).log(Level.SEVERE, null, ex);
            this.dataSize = 0;
        }

        this.setRowCount(dataSize);

        return data;

    }
}
